import ri.core.IRInfo
import util.InterfaceTwitter

class UsuarioController {

	static allowedMethods = [save: "POST", update: "POST", delete: "POST"]
	static Map<String, InterfaceTwitter> acessos = new TreeMap<String, InterfaceTwitter>()
	static InterfaceTwitter inter = InterfaceTwitter.getInstance();

	def index = {
		try{
			inter = InterfaceTwitter.getInstance();
			inter.setAuthConsumerTwitter()
			inter.recuperaRequest()
			String url = inter.geraURL()
			acessos.put ("temp", inter)
			render(view: "pin", model: [urlPIN: url])
		}catch (Exception e){
		}
	}

	def list = {
		params.max = Math.min(params.max ? params.int('max') : 10, 100)
		[usuarioInstanceList: Usuario.list(params), usuarioInstanceTotal: Usuario.count()]
	}

	def pin = {
	}

	def logout ={ render(view: "/index") }

	def aceitarAmizade = {
		String par = params.entrySet().toString()
		par = par.substring (1, par.indexOf ('='))
		String eu = par.substring (0, par.indexOf (":"))
		String amigo = par.substring (par.indexOf (":")+1)

		def usuarioInstance = Usuario.findByPerfil(eu)
		Usuario.requisicoes.get (usuarioInstance.id.toString()).remove(amigo)
		Usuario.amigos.get (usuarioInstance.id.toString()).add(amigo)
		Usuario.amigos.get (Usuario.findByPerfil(amigo).id.toString()).add(eu)
		redirect(action: "show", id: usuarioInstance.id, params:["usuarioLogado":eu])
	}

	def recusarAmizade = {
		String par = params.entrySet().toString()
		par = par.substring (1, par.indexOf ('='))
		String eu = par.substring (0, par.indexOf (":"))
		String amigo = par.substring (par.indexOf (":")+1)

		def usuarioInstance = Usuario.findByPerfil(eu)
		Usuario.requisicoes.get (usuarioInstance.id.toString()).remove(amigo)
		redirect(action: "show", id: usuarioInstance.id, params:["usuarioLogado":eu])
	}

	def autentica = {
		String pin = params.pin
		Usuario usuarioInstance
		try{

			acessos.get("temp").returnAccess(pin)
			acessos.get("temp").autentica()

			usuarioInstance = Usuario.findByPerfil(acessos.get("temp").getLoginUsuario())

			if (usuarioInstance == null){
				usuarioInstance = new Usuario(perfil:acessos.get("temp").getLoginUsuario())
				usuarioInstance.save()
			}
			acessos.put (usuarioInstance.perfil, acessos.get("temp"))
			redirect(action: "show", id: usuarioInstance.id, params:["usuarioLogado":usuarioInstance.perfil])
		}catch (Exception e){
			e.printStackTrace()
		}
	}
	def create = {
		def usuarioInstance = new Usuario()
		usuarioInstance.properties = params
		return [usuarioInstance: usuarioInstance]
	}

	def save = {
		def usuarioInstance = new Usuario(params)
		if (usuarioInstance.save(flush: true)) {
			flash.message = "${message(code: 'default.created.message', args: [message(code: 'usuario.label', default: 'Usuario'), usuarioInstance.id])}"
			redirect(action: "show", id: usuarioInstance.id)
		}
		else {
			render(view: "create", model: [usuarioInstance: usuarioInstance])
		}
	}

	def serAmigo = {
		def usuarioInstance = Usuario.findByPerfil(params.perfil)
		Usuario.requisicoes.get (usuarioInstance.id.toString()).add(acessos.get(params.usuarioLogado).getLoginUsuario())
		redirect(action: "show", id: usuarioInstance.id, params:["usuarioLogado":params.usuarioLogado])
	}

	def enviarDM = {
		acessos.get(params.usuarioLogado).getTwitter().sendDirectMessage (params.usuario, UsuarioService.getMessage())
		def usuarioInstance = Usuario.findByPerfil(params.usuarioLogado)
		flash.message="Convite feito para "+ params.usuario + "!"
		redirect(action: "show", id: usuarioInstance.id, params:["usuarioLogado":params.usuarioLogado])
	}

	def show = {
		def usuarioInstance
		if (params.perfil != null){
			usuarioInstance = Usuario.findByPerfil(params.perfil)
		}else{
		 	usuarioInstance = Usuario.get(params.id)
		}
		if (!usuarioInstance) {
			flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'usuario.label', default: 'Usuario'), params.id])}"
			redirect(action: "list")
		}
		else if (usuarioInstance.perfil.equals (params.usuarioLogado)){
			List info = acessos.get(params.usuarioLogado).getInformacoesUsuario()
			List <List<Object>> recomendacoes = new LinkedList<LinkedList<Object>> ()
			List <List<Object>> amigos = new LinkedList<LinkedList<Object>> ()
			List <List<Object>> requisicoes = new LinkedList<LinkedList<Object>> ()
			IRInfo ir = IRInfo.getInstance(acessos.get(params.usuarioLogado));
			System.out.println("Aqui: " + ir);
			System.out.println("em baixo: " + acessos.get(params.usuarioLogado));
			ir.atualizarIR();

			for (String perfil in ir.recomendacoes(10)){
				if (!usuarioInstance.amigos.get(usuarioInstance.id.toString()).contains (perfil)){
					if (!perfil.equals (usuarioInstance.perfil)){
						recomendacoes.add (acessos.get(params.usuarioLogado).getInformacoesUsuarioQualquer (perfil))
					}
				}
			}

			for (String perfil in Usuario.amigos.get(usuarioInstance.id.toString())){
				amigos.add (acessos.get(params.usuarioLogado).getInformacoesUsuarioQualquer (perfil))
			}

			for (String perfil in Usuario.requisicoes.get(usuarioInstance.id.toString())){
				requisicoes.add (acessos.get(params.usuarioLogado).getInformacoesUsuarioQualquer (perfil))
			}

			[usuarioInstance: usuarioInstance, info:info, recomendacoes:recomendacoes, usuarioLogado: params.usuarioLogado, amigos:amigos, requisicoes:requisicoes]
		}
		else{
			List info = acessos.get(params.usuarioLogado).getInformacoesUsuarioQualquer (usuarioInstance.perfil)
			List <List<Object>> amigos = new LinkedList<LinkedList<Object>> ()
			for (String perfil in Usuario.amigos.get(usuarioInstance.id.toString())){
				amigos.add (acessos.get(params.usuarioLogado).getInformacoesUsuarioQualquer (perfil))
			}

			[usuarioInstance: usuarioInstance, info:info, recomendacoes:null, usuarioLogado: params.usuarioLogado, amigos:amigos]
		}
	}

	def contarHistoria = {
		def usuarioInstance = Usuario.findByPerfil(params.usuarioLogado)
		usuarioInstance.segredos.get (usuarioInstance.id.toString()).add(params.historia)
		usuarioInstance.save()
		redirect(action: "show", id: usuarioInstance.id, params:["usuarioLogado":params.usuarioLogado])
	}

}
